package com.imooc.service.impl;

import com.imooc.service.StuService;
import com.imooc.service.TestTransService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class TestTransServiceImpl implements TestTransService {

    @Autowired
    private StuService stuService;

    /**
     *事务传播 -ProPropagation
     * REQUIRED 如果当前存在事务，则加入该事务，使用当前的事务；如果当前没有事务，则新增一个事务，子方法是必须运行在一个事务中的；
     *
     * SUPPORTS 如果当前存在事务，则使用当前的事务；如果当前没有事务，则不使用事务；
     * MANDATORY 该传播属性必须强制存在一个事务，如果不存在，则抛出异常（调用方必须存在一个事务）
     * REQUIRES_NEW 如果当前存在事务，则挂起当前事务，开启新的事务；如果当前没有事务，则同REQUIRED
     * NOT_SUPPORTED 如果当前存在事务，则挂起当前事务，不使用事务；
     * NEVER 该传播属性不能存在事务中，如果存在，则抛出异常（调用方不能存在事务中）
     * NESTED 如果当前有事务，则开启子事务（嵌套事务），嵌套事务是独立提交或者回滚；如果当前没有事务则通REQUIRED;
     * 但是如果主事务提交，则会携带子事务一起提价；
     * 如果主事务回滚，则子事务会一起回滚，相反，子事务异常，则父事务可以回滚或者不回滚。
     */
    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void testPropergationTrans() {
        stuService.saveParent();

        try {
            stuService.saveChildren();
        } catch (Exception e) {
            e.printStackTrace();
        }

//        int a= 1/0;
    }
}
